#ifndef vecteurRaveH
#define vecteurRaveH
// BIBLIOTHEQUES
#include <vector>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <gmpxx.h>

#include "../all2.h"
//#include "../EPlateau.h"
#include <gmpxx.h>

class EPlateau;
//class mpq_t;
//using namespace std;


// STRUCTURES DE DONNEES
struct maillonUCT
{
        // les donnees
        Po piece ;
        int score ;   //score = somme brutale des pieces posées
        int nbJeux ;


		double proba; //le rationnel contenant la probablité que cette piece soit bonne.

        int scoreTemp;
        int nbJeuxTemp;
        // gerer la liste chainee
        struct maillonUCT *suivant ;
        struct maillonUCT *precedent ;
        bool libre ;
        bool lu;

};


// HEURISTIQUE
// Il va nous servir pour choisir quel emplacement joue a noeud n(i)
// On va se base sur un vecteur qui garde tous les mouvements possibles, classés avec leur meilleur ratio
// de pieces posées / nombres de fois joues
class vecteurRave
{
        private:

        //vector<maillonUCT> tableMaillons;
		maillonUCT * tableMaillons;

       maillonUCT * racine ; //ponte vers le premier maillon dans tableMaillons
       maillonUCT * courant ;  //pointe vers le maillon courant dans tableMaillons

        std::ofstream * fichierlogthread;
        maillonUCT * last ;
        Coord position;

		int taille;


        public:

            static mpz_class limite;

                // CONSTRUCTEURS
            vecteurRave(); //Crée bun vecteur creux, qui doit ensuite etre initialisé par initialisateur(vector<Po> listePo, Coord p). Ne pas utiliser sans etre sur que le vecteur sera initialisé par la suite...
            vecteurRave(vector<Po> listePo, Coord p) ; // cree un vecteur RAVE rempli par la liste des pieces orientées
            //constructeur par COPIE
            vecteurRave(vecteurRave * l);
            void initialisateur(vector<Po> listePo, Coord p) ;
            // ACCESSEURS
            maillonUCT* getRacine();
            int getNbMaillon();
            //maillonUCT *existe(maillonUCT *m) ;

            // METHODES
            // ajoute un maillon dans la liste pour la garder dans l'ordre decroissant le ratio des Coup
           // void ajouterMaillon(maillonUCT* m) ;
                // trouver le coup disponible avec le meilleur ratio
             //   Coup trouverMeilleurMaillon() ;



			void majValeurs(int score, int emplacement, double monEmbranchement, double emBranchementTotal);


                //trovuer coup disp avec meilleur ratio, en tennant compte de ce qui ets jouable sur le Goban.
            Po trouverMeilleurMaillon(EPlateau * p);
            // renvoi le ratio correspondant au Coup donne. Renvoi -1 si le coup n'existe pas
          //  double trouverRatio(Coup c) ;
            // augmente de 1 le nombre de jeux et remet les coups a 'libre'
            // augmente aussi les victoires si le boolean est a vrai
            void partieFinie(vecteurRave * listeCustom) ;
            void partieFinie(bool b);

            // On veut jouer ce coup. La fonction verifie que le coup n'existe pas
            // deja Si  non, il est rajouter a la liste chainee
            //void veutJouer(Coup c) ;

            //fonction qui permet de faire une initialisation des membres de la liste chainée.
            void addMaillonTrick(Po pieceO, int x);

            //reinitialise proprement la liste.
            void raz( );

            //fonction changeable de calcul de "score"
            double  getRatio(maillonUCT * monMaillon);
            double  getRatio(int i);

            //Supprime le maillon M auinsi que les suivants poitnés apr lui.
            void delMaillon( maillonUCT * m );

            //Diviser le nbJeux et le nbVictoires de tout les noeuds.
            void divise(int n);

            // affiche la liste des maillons dans la liste
            void afficherListeMaillons();

            //met a jour le vrai maillon (pas la copie) en fonction d'un maillon copié.
            void majVraiMaillon(maillonUCT * maillonCherche,vecteurRave * listeChainee);

            //vector<maillonUCT> getTableMaillons
            maillonUCT getMaillon(int num);

            int getNbMaillons();
};

/* Listes des fichiers modifies avec la ligne
-------------
arbreUCT.cpp
-------------
200 -> 227 / 233 -> 241 / 128 -> 138


-----------
arbreUCT.h
-----------
27 -> 28 / 41 -> 43 / 73 -> 75
*/
#endif
